#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
/*
深拷贝是指不仅拷贝对象的成员变量，还拷贝对象所指向的动态分配的内存。
在深拷贝中，如果对象的成员变量中有指针，那么拷贝后的指针将指向新分配的内存，而不是原始对象所指向的内存。
这可以避免浅拷贝中可能出现的问题*/
class myString
{
public:
    char * pStr;
    int len;
public:
    myString()
    {
        cout<<"构造函数1"<<endl;
        pStr = NULL;
        len = 0;
    }
    explicit myString(const char * pStr)
    {
        cout<<"构造函数2"<<endl;
        len = strlen(pStr);//得到传入的字符串的长度
        this->pStr = new char[len+1];//分配一个与传入数据一样大的空间，+1是为了存放字符串的结束标记
        strcpy(this->pStr,pStr);//把传入的数据拷贝到我们自己的空间，这样就可以修改自己的数据了
    }
    myString(const myString & str)
    {
        cout<<"构造函数3"<<endl;
        len = str.len;
        pStr = new char[len+1];
        strcpy(pStr,str.pStr);
    }

};

int main()
{
    myString str2("efg");//与上面一行代码等效
    myString str1 = str2 ;//构造函数的另一种调用方式，通过预制匹配的等于号调用

    str1.pStr[0] = 't';

    cout<<str1.pStr<<" "<<str2.pStr<<endl;
    return 0;
}
